Universal object crate
Universal object crates (ユニバーサルオブジェクトクレート)はプロパティが動的に定義されるクラスのこと。
静的解析とプロパティ
たとえば json_decode() の結果を考える
code:php
$json = '{"key"; "value"}';
$obj = json_decode($json);
echo $obj->key;
通常のクラスであればプロパティは明示的に宣言されていることが期待されるが、このようなクラスはプロパティを静的に予測できない。
このような特殊な役割を持ったクラスをUniversal object cratesとして分析することで、このような行に対して未定義プロパティとして警告を避けられる
この機能を単に未定義プロパティへのアクセス警告を握り潰すために使うべきではなく、デシリアライズ結果など静的に分析させることが適切ではない対象についてのみ慎重に使うことが望ましい
PHPStan
code:phpstan.dist.neon
parameters:
universalObjectCratesClasses:
- Dibi\Row
- Ratchet\ConnectionInterface
- SolrObject
デフォルトではstdClassとSimpleXMLElementが設定されている
実際にはSimpleXMLElementに関しては SimpleXMLElementClassPropertyReflectionExtension が同等の機能を提供している
Psalm
code:xml
<universalObjectCrates>
<class name="Dibi\Row" />
<class name="Ratchet\ConnectionInterface" />
<class name="SolrObject" />
</universalObjectCrates>
デフォルトではstdClassとSimpleXMLElementが設定されている
By default, stdClass and SimpleXMLElement are configured to be universal object crates.